package bomberman.modelo.armas;

import java.util.HashMap;

import org.jdom2.Element;

import fiuba.algo3.titiritero.modelo.ObjetoVivo;

import bomberman.modelo.mapa.Casillero;
import bomberman.modelo.mapa.Direccion;
import bomberman.modelo.observadores.Observadores;
import bomberman.modelo.personajes.Personaje;

public class Proyectil extends Bomba implements ObjetoVivo {
  private static final int DESTRUCCION_PROYECTIL_STD = 1;
  private static final int RADIO_PROYECTIL_STD       = 1;
  private static final int ALCANCE_PROYECTIL_STD     = 5;
  
  private int              alcance;
  private Direccion        direccion;
  
  public Proyectil(Casillero unaUbicacion, Direccion direccion) {
    super(Proyectil.DESTRUCCION_PROYECTIL_STD, Proyectil.RADIO_PROYECTIL_STD,
      unaUbicacion);
    this.alcance = Proyectil.ALCANCE_PROYECTIL_STD;
    this.direccion = direccion;
    this.ubicacion.setContenidoMedio(this);
    Observadores.notificar(this);
  }
  

public int getAlcance() {
    return this.alcance;
  }
  
  public Direccion getDireccion() {
    return this.direccion;
  }
  
  protected void desplazate() {
    Casillero ubicacionActual = this.getUbicacion();
    HashMap<Direccion, Casillero> vecinos = ubicacionActual.getVecinos();
    if (this.alcance > 0) {
      if (vecinos.get(this.direccion) != null) {
        Casillero ubicacionFutura = vecinos.get(this.direccion);
        if (ubicacionFutura.esBalisticamentePermeable()) {
          this.getUbicacion().setContenidoMedio(null);
          this.setUbicacion(ubicacionFutura);
          this.getUbicacion().setContenidoMedio(this);
          this.alcance -= 1;
        } else {
          this.alcance = 0;
          this.impactar();
        }
      }
    } else {
      this.alcance = 0;
      this.impactar();
    }
  }
  
  private void impactar() {
    Explosion.explotar(this.getUbicacion().getPosicion());
    Observadores.notificar(this);
    HashMap<Direccion, OndaExpansiva> ondasExpansivas = this.explotar();
    this.procesarExplosion(ondasExpansivas);
  }
  
  @Override
  protected void desaparecer() {
    this.getUbicacion().setContenidoMedio(null);
  }
  
  @Override
  public boolean esCaminablePor(Personaje unPersonaje) {
    return true;
  }
  
  @Override
  public boolean esSobrevolable() {
    return true;
  }
  
  @Override
  public boolean esBalisticamentePermeable() {
    return false;
  }
  
  @Override
  public void vivir() {
    this.desplazate();
  }

@Override
public Element serializar() {
	Element eProyectil = new Element("Proyectil");
	eProyectil.setAttribute("Direccion",String.valueOf(this.getDireccion()));
	eProyectil.setAttribute("Alcance",String.valueOf(this.getAlcance()));
	return (super.serializar(eProyectil));
}

public static Proyectil recuperar(Element eProyectil, Casillero casillero) {
	Direccion direccionRecuperada = Direccion.valueOf(eProyectil.getAttributeValue("Direccion"));
	int alcanceRecuperado = Integer.parseInt(eProyectil.getAttributeValue("Alcance"));
	Proyectil nuevoProyectil = new Proyectil (casillero,direccionRecuperada);
	nuevoProyectil.setAlcance(alcanceRecuperado);
	casillero.setContenidoMedio(nuevoProyectil);
	return nuevoProyectil;
}


private void setAlcance(int alcanceRecuperado) {
	this.alcance=alcanceRecuperado;
}
}
